#ifndef MESSAGE_H
#define MESSAGE_H

#include "qstring.h"
#include "qbytearray.h"
#include "qmap.h"

#include <QTemporaryFile>

#define HEADEND  "\xD\xA"
#define BODYEND  "\xD\xA.\xD\xA"

#define PR_MESSAGE_LENGTH "SIZE"

class QIODevice;

class Message
{

public:    
    Message();// Стандартный конструктор
    Message(const QByteArray &buffer); // Конструктор в котором происходит десериализация объекта Message
    Message(QIODevice *device);
    ~Message();
    void init();

    void setParam(const QString & name,const QString & value);// Установить пару ключ-значение в заголовке сообщения
    const QString & getParam(const QString &parName);// Получить значение по ключу
    void clearParams() {head.clear();} //Очистить заголовок
    QMap<QString,QString>::const_iterator getHeadBegin() {return head.constBegin();} // Вернуть итератор начала заголовка
    QMap<QString,QString>::const_iterator getHeadEnd() {return head.constEnd();}    //Вернуть итераор конца заголовка
    QByteArray getBody();
    QTemporaryFile* getBodyFile() { return &m_bodyFile; }
    quint32 getMessageLength(); // Вернуть длинну сообщения в байтах

    void parseBuffer(const QByteArray &buffer);// Десериализация объекта
    void parseBuffer(QIODevice *device);

    bool packBody();

    void debug(); // Вывести все данные сообщения во время дебага

private:
    QMap<QString,QString> head; // Контейнер Map для пар значения ключ-значение
    QTemporaryFile m_bodyFile;
};

#endif // MESSAGE_H
